//执行命令npx ts-node deduplicateToMap.ts
import { MongoClient } from 'mongodb';
import axios from 'axios';

// MongoDB 配置
const mongoUrl = 'mongodb://localhost:27017';
const dbName = 'risk_backend';
const sourceCollectionName = 'company_scores';
const targetCollectionName = 'map'; // 新集合名称

// 腾讯位置服务 API 配置
const tencentMapKey = 'F2PBZ-E62CB-VWQUW-NBNO7-6UM22-SUBS2';
const tencentMapApiUrl = 'https://apis.map.qq.com/ws/geocoder/v1/';

async function getCoordinates(address: string): Promise<{ lat: number; lng: number } | null> {
  try {
    // 校验地址是否为空
    if (!address || address.trim() === '') {
      console.error('❌ 地址为空，无法获取经纬度');
      return null;
    }

    // 调用腾讯位置服务 API
    const response = await axios.get(tencentMapApiUrl, {
      params: {
        address, // 地址
        key: tencentMapKey, // API 密钥
      },
    });

    if (response.data.status === 0) {
      const { lat, lng } = response.data.result.location;
      return { lat, lng };
    } else {
      console.error(`❌ 获取经纬度失败: ${response.data.message}`);
      return null;
    }
  } catch (error) {
    console.error(`❌ 请求腾讯位置服务失败: ${error}`);
    return null;
  }
}

async function deduplicateData() {
  const client = new MongoClient(mongoUrl);

  try {
    console.log('🚀 正在连接到 MongoDB...');
    await client.connect();
    const db = client.db(dbName);
    const sourceCollection = db.collection(sourceCollectionName);
    const targetCollection = db.collection(targetCollectionName);

    console.log('📦 清空目标集合...');
    await targetCollection.deleteMany({}); // 清空目标集合

    console.log('📊 正在去重数据...');
    const deduplicatedData = await sourceCollection
      .aggregate([
        {
          $sort: { InfoPubDate: -1 }, // 按 InfoPubDate 降序排序，保留最新的数据
        },
        {
          $group: {
            _id: '$LComNm', // 按 LComNm 分组
            latestRecord: { $first: '$$ROOT' }, // 获取每组的最新记录
          },
        },
        {
          $replaceRoot: { newRoot: '$latestRecord' }, // 替换根为最新记录
        },
      ])
      .toArray();

    console.log(`✅ 去重完成，共处理 ${deduplicatedData.length} 条数据`);

    console.log('📥 正在获取经纬度并存储到目标集合...');
    for (const record of deduplicatedData) {
      const address = record.LComNm; // 使用公司名称作为地址
      const coordinates = await getCoordinates(address);

      if (coordinates) {
        record.location = coordinates; // 添加经纬度信息
      } else {
        record.location = { lat: null, lng: null }; // 如果获取失败，设置为空
      }
    }

    await targetCollection.insertMany(deduplicatedData);

    console.log('🎉 数据处理完成，已存储到集合 "map" 中');
  } catch (error) {
    console.error('❌ 数据处理出错:', error);
  } finally {
    await client.close();
    console.log('🔒 MongoDB 连接已关闭');
  }
}

deduplicateData();
// 运行此脚本前，请确保 MongoDB 服务已启动，并且数据库和集合已创建。